package io.mvvm.netty.simple;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.TimeUnit;

/**
 * @program: Netty
 * @description:
 * @author: 潘
 * @create: 2021-04-23 20:52
 **/
@ChannelHandler.Sharable
public class NettyServerHandler extends ChannelInboundHandlerAdapter {

    private final static Logger logger = LoggerFactory.getLogger(NettyServerHandler.class);

    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        System.out.println("客户端已连接");
    }

    /**
     * 读取客户端发送过来的数据- scheduledTaskQueue 定时任务队列
     * @param ctx   上下文对象，包含 pipeline(管道)、channel(通道)、地址
     * @param msg   客户端传递来的消息
     * @throws Exception
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        logger.info("server context : {}", ctx);

        // 参数一：业务实现、参数二：延迟时间、参数三：时间单位
//        ctx.channel().eventLoop().schedule(new Runnable() {
//            @Override
//            public void run() {
//                try {
//                    Thread.sleep(10 * 1000);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//                ctx.writeAndFlush(Unpooled.copiedBuffer("Hello Netty2~", CharsetUtil.UTF_8));
//            }
//        }, 5, TimeUnit.SECONDS);

        ByteBuf buf = (ByteBuf) msg;
        logger.info("客户端发送的消息是 : {}", buf.toString(CharsetUtil.UTF_8));
        logger.info("客户端的地址是 : {}", ctx.channel().remoteAddress());
    }

//    /**
//     * 读取客户端发送过来的数据-taskQueue任务队列
//     * @param ctx   上下文对象，包含 pipeline(管道)、channel(通道)、地址
//     * @param msg   客户端传递来的消息
//     * @throws Exception
//     */
//    @Override
//    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
//        logger.info("server context : {}", ctx);
//
//        // 定义 taskQueue 实现异步任务。解决 : 业务时间过长导致长时间阻塞
//        ctx.channel().eventLoop().execute(new Runnable() {
//            @Override
//            public void run() {
//                try {
//                    Thread.sleep(10 * 1000);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//                ctx.writeAndFlush(Unpooled.copiedBuffer("Hello Netty2~", CharsetUtil.UTF_8));
//            }
//        });
//
//        ByteBuf buf = (ByteBuf) msg;
//        logger.info("客户端发送的消息是 : {}", buf.toString(CharsetUtil.UTF_8));
//        logger.info("客户端的地址是 : {}", ctx.channel().remoteAddress());
//    }

//    /**
//     * 读取客户端发送过来的数据-快速入门
//     * @param ctx   上下文对象，包含 pipeline(管道)、channel(通道)、地址
//     * @param msg   客户端传递来的消息
//     * @throws Exception
//     */
//    @Override
//    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
//        logger.info("server context : {}", ctx);
//
//        ByteBuf buf = (ByteBuf) msg;
//
//        logger.info("客户端发送的消息是 : {}", buf.toString(CharsetUtil.UTF_8));
//        logger.info("客户端的地址是 : {}", ctx.channel().remoteAddress());
//    }

    /**
     * 数据读取完毕
     * @param ctx
     * @throws Exception
     */
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {

        // 将数据写入到缓存，并刷新
        // 将数据编码后发送
        ctx.writeAndFlush(Unpooled.copiedBuffer("Hello Netty1~", CharsetUtil.UTF_8));

    }

    /**
     * 发生异常
     * @param ctx
     * @param cause
     * @throws Exception
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
    }

}
